#ifndef VZLPR_ADDON_ASYNCINVOKER_H_
#define VZLPR_ADDON_ASYNCINVOKER_H_

#include "JsonObject.h"

class AsyncInvoker : public Nan::AsyncWorker {
public:
  AsyncInvoker(
    Nan::Callback* callback,
    JsonObject::Ptr param,
    std::function<void(void)> invoke);

  AsyncInvoker(
    Nan::Callback* callback,
    JsonObject::Ptr param,
    std::function<JsonObject::Ptr(void)> invoke);

  AsyncInvoker(
    Nan::Callback* callback,
    JsonObject::Ptr param,
    std::function<void(JsonObject::Ptr)> invoke);

  AsyncInvoker(
    Nan::Callback* callback,
    JsonObject::Ptr param,
    std::function<JsonObject::Ptr(JsonObject::Ptr)> invoke);

  ~AsyncInvoker();
  void Execute();
  void HandleOKCallback();

private:
  JsonObject::Ptr param_;
  JsonObject::Ptr result_;
  std::function<void(void)> invoke1_;
  std::function<JsonObject::Ptr(void)> invoke2_;
  std::function<void(JsonObject::Ptr)> invoke3_;
  std::function<JsonObject::Ptr(JsonObject::Ptr)> invoke4_;
};

#endif //  VZLPR_ADDON_ASYNCINVOKER_H_
